/**
 * 
 */
package javavis.jip2d.functions;

import javavis.base.ImageType;
import javavis.base.JIPException;
import javavis.base.parameter.JIPParamInt;
import javavis.jip2d.base.FunctionGroup;
import javavis.jip2d.base.JIPFunction;
import javavis.jip2d.base.JIPImage;
import javavis.jip2d.base.bitmaps.JIPBmpByte;
import javavis.jip2d.base.bitmaps.JIPBmpFloat;

/**
 * @author asc
 * 
 */
public class FIntegralImage extends JIPFunction {

	/**
	 * 
	 */
	public FIntegralImage() {
		name = "FIntegralImage";
		description = "Calcula la imagen integral. Sin parametros. Devuelve una imagen de tipo FLOAT";
		groupFunc = FunctionGroup.Applic;

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * javavis.jip2d.base.JIPFunction#processImg(javavis.jip2d.base.JIPImage)
	 */
	@Override
	public JIPImage processImg(JIPImage img) throws JIPException {
		// Comprobacion Entrada
		if (img.getType() != ImageType.BYTE)
			throw new JIPException("Se esperaba una imagen a BYTE\n");

		// Declaracion de la imagen de salida
		JIPBmpFloat Salida = new JIPBmpFloat(img.getWidth(), img.getHeight());
/*		float[] imgSalida = Salida.getAllPixelsFloat();

		// Declaracion de la imagen de Entrada
		double[] imgEntrada = ((JIPBmpByte) img).getAllPixels();

		// Variables de Control
		int tamanyo = img.getWidth() * img.getHeight();
		int ancho = img.getWidth();
		int contadorLinea = ancho;
		int sumaAnterior = 0;

		// Procesado de imgEntrada
		for (int i = 0; i < tamanyo; i++) {
			if (i >= ancho) {
				// Todas las Linea menos primera
				if (contadorLinea != ancho) {
					//Resto Columnas -0
					imgSalida[i] = (float) imgEntrada[i] + imgSalida[i - 1]	+ imgSalida[sumaAnterior] - imgSalida[sumaAnterior - 1];
					sumaAnterior++;
					contadorLinea++;
				} else {
					//Columna 0
					imgSalida[i] = (float) imgEntrada[i] + imgSalida[sumaAnterior];
					sumaAnterior++;
					contadorLinea = 1;
				}

			} else {
				// Primera Linea
				if (i != 0) {
					// Resto Posiciones -0
					imgSalida[i] = imgSalida[i - 1] + (float) imgEntrada[i];
				} else {
					// Posicion 0
					imgSalida[i] = (float) imgEntrada[i];
				}
			}
		}

		Salida.setAllPixelsFloat(imgSalida);
*/
		
		Salida.setPixel(0, 0, ((JIPBmpByte) img).getPixelByte(0, 0));
		for (int i = 1; i < img.getWidth(); i++)
        {
            Salida.setPixel(0, i, ((JIPBmpByte) img).getPixelByte(0, i) + Salida.getPixel(0, i));
        }
		for (int i = 1; i < img.getHeight(); i++)
        {
            Salida.setPixel(i, 0, Salida.getPixel(i-1, 0)+((JIPBmpByte) img).getPixelByte(i, 0) );
        }
		for (int i = 1; i < img.getWidth(); i++)
        {
		    float[] columna = new float[img.getHeight()];
             for (int j = 1; j < img.getHeight(); j++)
            {
                 if(i!=img.getWidth())
                 if(j!=1)columna[j-1]  += ((JIPBmpByte) img).getPixelByte(j-1, i) + columna[j-2];
                 else columna[j-1]  += ((JIPBmpByte) img).getPixelByte(j-1, i);
                 Salida.setPixel(j, i, Salida.getPixel(j, i-1)+ columna[j-1] +((JIPBmpByte) img).getPixelByte(j, i ));
            }
            
        }
		
		return Salida;
	}

}
